package com.example.springmvc;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/** 
 * 【请求】
 */
@RestController
@RequestMapping("/request")
public class RequestController {
    /**
     * 传递单个参数
     * @param s1
     */
    // http://127.0.0.1:8080/request/r1?s1=hello
    @RequestMapping("/r1")
    public String r1(String s1){
        return "接收到参数：" + s1;
    }

    @RequestMapping("/r2")
    public String age(Integer age){
        if(age == null){
            return "参数不能为空";
        }
        return "接收到参数：" + age;
    }

    @RequestMapping("/r3")
    public String r3(boolean flg){
        return "接收到参数：" + flg;
    }

    /**
     * 传递多个参数
     * @param name
     * @param age
     */
    @RequestMapping("/r4")
    public String r4(String name,Integer age){
        return String.format("接收到参数：姓名[%s]，年龄[%d]",name,age);
    }

    /**
     * 传递对象
     * @param person
     */
    @RequestMapping("/r5")
    public String r5(Person person){
        return "接收到参数：" + person;
    }

    /**
     * 后端参数重命名
     * @param userName
     */
    @RequestMapping("/r6")
    // required = false 设置为非必传参数（默认是true 必传参数）
    public String r6(@RequestParam(value = "name",required = false) String userName){
        return "接收到参数：" + userName;
    }

    /**
     * 传递数组
     * @param array
     */
    @RequestMapping("/r7")
    public String r7(String[] array){
        return "接收到参数：" + Arrays.toString(array);
    }

    /**
     * 传递集合
     * @param list
     */
    @RequestMapping("/r8")
    // 默认情况下，请求中参数名相同的多个值，是封装到数组.
    // 如果要封装到集合，要使用@RequestParam 绑定参数关系
    public String r8(@RequestParam List<String> list){
        return "接收到参数：" + list ;
    }

    /**
     * 传递 JSON 对象
     * @param person
     */
    @RequestMapping("/r9")
    // 接收JSON对象，需要使用 @RequestBody 注解
    // RequestBody 请求正文，意思是这个注解作用在请求正文的数据绑定，请求参数必须在写在请求正文中
    public String r9(@RequestBody Person person){
        return "接收到参数：" + person;
    }

    /**
     * 获取 URL 中的参数
     * @param articleId
     * 应用场景：参数不能为空
     */
    // http://10.10.65.10/request/1
    // pathVariable：路径变量
    // 和字面表达的意思一样,这个注解主要作用在请求URL路径上的数据绑定
    // 默认传递参数写在URL上,SpringMVC就可以获取到
    @RequestMapping("/{articleId}")
    public String r10(@PathVariable Integer articleId){
        return "接收到参数：" + articleId;
    }

    // http://10.10.65.10/request/blog/1
    @RequestMapping("/{type}/{articleId}")
    public String r11(@PathVariable("type") String typeName, @PathVariable Integer articleId){
        return "获取到参数：type：" + typeName + " articleId：" + articleId;
    }

    /**
     * 上传文件
     * @param file
     * @throws IOException
     */
    @RequestMapping("/r12")
    public String r12(MultipartFile file) throws IOException {
        String name = file.getName();
        String originalFilename = file.getOriginalFilename();
        System.out.println("originalFilename：" + originalFilename);
        String contentType = file.getContentType();
        System.out.println("contentType：" + contentType);
        // 文件上传到指定路径
        file.transferTo(new File("d:\\file\\" + originalFilename));
        return "接收到文件：" + name;
    }

}
